﻿using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using WPFServices.Model;

namespace WPFServices.Services
{
    public static class OrderManagementService
    {
        /// <summary>
        /// ham lay ra danh sach Order theo ngay thang, idCatalog va theo dạng order (nhập, xuất)
        /// </summary>
        /// <param name="dFrom">ngày bắt đầu để so sánh</param>
        /// <param name="dTo">ngày kết thúc để so sánh</param>
        /// <param name="catalogID">ID (int) của catalog</param>
        /// <param name="isExportOrder">true => xuất , false => nhập</param>
        /// <returns></returns>
        public static ObservableCollection<ModelOrderManagement> GetAllListBillsByDate(DateTime dFrom, DateTime dTo, int catalogID, bool isExportOrder)
        {
            using (var db = new VLXDKH_QLKEntities())
            {
                List<ORDER> listORDER = new List<ORDER>();
                try
                {       
                    if (catalogID > 0) // xác định xem có id catalog hay k?
                    {
                        listORDER = isExportOrder ? db.ORDERS.Where(or => or.DATE_ORD >= dFrom && or.DATE_ORD <= dTo && or.ID_CATALOG == catalogID && or.ORDER_TYPE == 1).ToList() : db.ORDERS.Where(or => or.DATE_ORD >= dFrom && or.DATE_ORD <= dTo && or.ID_CATALOG == catalogID && or.ORDER_TYPE == 0).ToList();
                    }
                    else
                    {
                        listORDER = isExportOrder ? db.ORDERS.Where(or => or.DATE_ORD >= dFrom && or.DATE_ORD <= dTo && or.ORDER_TYPE == 1).ToList() : db.ORDERS.Where(or => or.DATE_ORD >= dFrom && or.DATE_ORD <= dTo && or.ORDER_TYPE == 0).ToList();
                    }
                    
                    
                }
                catch (Exception)
                {
                   throw  new Exception("Lỗi quản lý hóa đơn.");
                   
                }
                return convertToObservableCollection(listORDER);
            }
        }
        
        /// <summary>
        /// Hàm chuyển đổi từ danh sách ORDER thành ObserableCollection để dễ dàng thực hiên view
        /// </summary>
        /// <param name="listORDER">List ORDER nguồn</param>
        /// <returns>trả về 1 ObservableCollection</returns>
        private static ObservableCollection<ModelOrderManagement> convertToObservableCollection(List<ORDER> listORDER)
        {
            var lists = new ObservableCollection<ModelOrderManagement>();
            var listBills = listORDER.Select(x =>
                                                 x.DATE_ORD != null ? new ModelOrderManagement
                                                 {
                                                     IOrderID = x.ID_ORD,
                                                     DDateOrder = x.DATE_ORD.Value,
                                                     SCustomerName = x.CUSTOMER.NAME_CUS,
                                                     SStatus = x.ORDER_TYPE == 0 ? "" : x.STATUS_ORD == "0" ? "Trả hết" : "Còn nợ",
                                                     OrderType = x.ORDER_TYPE,
                                                     OrderTypeToString = x.ORDER_TYPE == 1 ? "Xuất" : "Nhập"
                                                 } : null);


            foreach (var ord in listBills)
                lists.Add(ord);
            return lists;
        }

        public static ObservableCollection<ModelOrderManagement> GetAllListBillsWithoutDate(int catalogID,bool isExportOrder)
        {
            using (var db = new VLXDKH_QLKEntities())
            {
                var lists = new ObservableCollection<ModelOrderManagement>();
                try
                {
                    IList<ORDER> listORDER;
                    if (catalogID > 0)
                    {
                        listORDER = isExportOrder ? db.ORDERS.Where(or => or.ID_CATALOG == catalogID && or.ORDER_TYPE == 1).ToList() : db.ORDERS.Where(or => or.ID_CATALOG == catalogID && or.ORDER_TYPE == 0).ToList();
                    }
                    else
                    {
                        listORDER = isExportOrder ? db.ORDERS.Where(or => or.ORDER_TYPE == 1).ToList() : db.ORDERS.Where(or => or.ORDER_TYPE == 0).ToList();
                    }

                    var listBills = listORDER.Select(x =>
                                                 x.DATE_ORD != null ? new ModelOrderManagement
                                                                          {
                                                                              IOrderID = x.ID_ORD,
                                                                              DDateOrder = x.DATE_ORD.Value,
                                                                              SCustomerName = x.CUSTOMER.NAME_CUS,
                                                                              SStatus = x.ORDER_TYPE == 0 ? "" : x.STATUS_ORD == "0" ? "Trả hết" : "Còn nợ",
                                                                              OrderType = x.ORDER_TYPE,
                                                                              OrderTypeToString = x.ORDER_TYPE == 1 ? "Xuất" : "Nhập"
                                                                          } : null);


                    foreach (ModelOrderManagement ord in listBills)
                        lists.Add(ord);
                }
                catch (Exception)
                {
                    
                     throw  new Exception("Lỗi quản lý hóa đơn.");
                }
                return lists;
            }
        }

        public static ObservableCollection<ModelOrderManagement> GetAllListBillsByCustomerName(string sName, DateTime? dFrom, DateTime? dTo, int catalogID, bool isExportOrder)
        {
            using (var db = new VLXDKH_QLKEntities())
            {
                List<ORDER> billList = new List<ORDER>();
                try
                {
                     if (catalogID > 0)
                    {
                        if (dFrom.HasValue && dTo.HasValue)
                            billList = db.ORDERS.Where(or => or.ID_CATALOG == catalogID && or.DATE_ORD >= dFrom.Value && or.DATE_ORD <= dTo.Value && or.CUSTOMER.NAME_CUS.Contains(sName)).ToList();
                        else
                            billList = db.ORDERS.Where(or => or.ID_CATALOG == catalogID && or.CUSTOMER.NAME_CUS.Contains(sName)).ToList();
                    }
                    else
                    {
                        if (dFrom.HasValue && dTo.HasValue)
                            billList = db.ORDERS.Where(or => or.DATE_ORD >= dFrom.Value && or.DATE_ORD <= dTo.Value && or.CUSTOMER.NAME_CUS.Contains(sName)).ToList();
                        else
                            billList = db.ORDERS.Where(or => or.CUSTOMER.NAME_CUS.Contains(sName)).ToList();
                    }
                    if(isExportOrder)
                        billList = billList.Where(x => x.ORDER_TYPE == 1).ToList();
                    else
                        billList = billList.Where(x => x.ORDER_TYPE == 0).ToList();
                }
                catch (Exception)
                {
                   throw  new Exception("Lỗi quản lý hóa đơn.");
                }
                return convertToObservableCollection(billList);
            }
        }

        /// <summary>
        /// hàm thực thi khi ở form quản lý hóa đơn thực hiện chức năng tìm kiếm hóa đơn theo Mã Nhân Viên
        /// </summary>
        /// <param name="UserID">Mã nhân viên</param>
        /// <param name="dFrom">NullAble ngày bắt đầu xét</param>
        /// <param name="dTo">NullAble ngày kết thúc xét</param>
        /// <param name="catalogID">Mã Catalog</param>
        /// <param name="isExportOrder"> xác định là loại hóa đơn nhập hay xuất</param>
        /// <returns></returns>
        public static ObservableCollection<ModelOrderManagement> GetListBillsByUser(int UserID, DateTime? dFrom, DateTime? dTo, int catalogID, bool isExportOrder)
        {
            using (var db = new VLXDKH_QLKEntities())
            {
                List<ORDER> billList = new List<ORDER>();
                try
                {
                    if (catalogID > 0)
                    {
                        if (dFrom.HasValue && dTo.HasValue)
                            billList = db.ORDERS.Where(or => or.ID_CATALOG == catalogID && or.DATE_ORD >= dFrom.Value && or.DATE_ORD <= dTo.Value && or.ID_USER == UserID).ToList();
                        else
                            billList = db.ORDERS.Where(or => or.ID_CATALOG == catalogID && or.ID_USER == UserID).ToList();
                    }
                    else
                    {
                        if (dFrom.HasValue && dTo.HasValue)
                            billList = db.ORDERS.Where(or => or.DATE_ORD >= dFrom.Value && or.DATE_ORD <= dTo.Value && or.ID_USER == UserID).ToList();
                        else
                            billList = db.ORDERS.Where(or => or.ID_USER == UserID).ToList();
                    }
                    if (isExportOrder)
                        billList = billList.Where(x => x.ORDER_TYPE == 1).ToList();
                    else
                        billList = billList.Where(x => x.ORDER_TYPE == 0).ToList();
                }
                catch (Exception ex)
                {
                    throw new Exception("Lỗi tìm kiếm hóa đơn.");
                }
                return convertToObservableCollection(billList);
            }
        }
    }
}
